package com.jt.provider.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Vector;
import java.util.concurrent.CopyOnWriteArrayList;

@RefreshScope
@RestController
public class ProviderCacheController {
    @Value("${useLocalCache:false}")
    private boolean useLocalCache;//开关

    @RequestMapping("/provider/cache01")
    public String doUseLocalCache01(){
        return "useLocalCache'value is   "+useLocalCache;
    }

    //目标：设计1个cache，我们要将从数据库取到数据存储cache中，下次取数据从cache取。
    //1)要保证数据的正确(线程安全)
    //2)要保证效率
    private List<String> cache=new CopyOnWriteArrayList<>();
    @RequestMapping("/provider/cache02")
    public List<String> doUseLocalCache02(){
        //1.配置中心useLocalCache值为false，则直接从数据库取
        if(!useLocalCache) {
            System.out.println("本地缓存开关没有打开，查询数据库");
            return Arrays.asList("A", "B", "C");//假设这是从数据库取的数据
        }
        //2.配置中心useLocalCache值为true，则执行如下步骤
        //2.1.从cache取数据，假如有则直接返回。
        if(cache.isEmpty()){
            synchronized (this) {
                if(cache.isEmpty()) {
                    System.out.println("本地缓存开关打开了，但是缓存没有数据，查数据库");
                    //查数据库(模拟)
                    List<String> list = Arrays.asList("A", "B", "C");
                    //将查询到的数据存储缓存中
                    cache.addAll(list);
                }
            }
        }
        //2.2.cache中没有数据则从数据库取数据，并将数据存储到cache中，然后返回数据
        return cache;
    }
}
